package com.ifp.opengate.boot.emum;

import java.util.HashMap;
import java.util.Map;

import com.ifp.opengate.boot.constants.Constants;

/**
 * 错误枚举
 * 
 * @author 灭霸 2018年11月1日 枚举类型errorCode，这个是标准open-gate错误码
 */
public enum ErrorEnum {

    // 内部使用
    /** 商户不存在 */
    merchantNotFoundError("OP00000001", "商户[{0}]不存在!"),
    /** 商户配置错误 */
    merchantConfigError("OP00000002", "商户配置错误,[{0}]不存在!"),
    /** 商户不存在 */
    merchantFreezedOrDel("OP00000003", "商户[{0}]已被冻结或销户!"),
    /** 商户维度并发访问控制错误 */
    merchantCurrentCotrolError("OP00000004", "您的请求过于频繁,请稍后再试!"),
    /** 商户api维度并发访问控制错误 */
    merchantApiCurrentCotrolError("OP00000005", "您对api[{0}]的请求过于频繁,请稍后再试!"),
    /** 商户维度流量访问控制错误 */
    merchantBandwidthCotrolError("OP00000006", "您的请求流量过大,请稍后再试!"),
    /** 商户api维度流量访问控制错误 */
    merchantApiBandwidthCotrolError("OP00000007", "您对api[{0}]的请求流量过大,请稍后再试!"),
    // ===================参数校验类错误======================
    /** 参数[xxx]为空 */
    paramNullOrEmptyError("OP00000008", " 参数[{0}]为空!"),
    /** 请求时间不合法 */
    requestTimeLegalityError("OP00000009", "请求时间[requestTime]不合法,{0}!"),
    /** 请求流水不合法 */
    requestIdLegalityError("OP00000010", "请求流水[requestId]不合法,请以17位请求时间[requestTime]作为前缀后加6位随机数!"),
    /** 参数为空 */

    paramNoFoundError("OP00000011", " 参数[%s]为空,请配置[%s]!"),

    /**
     * 反欺诈
     */
    unFraudError("OP00000012", "unFraud: 当前调用存在风险, 拒绝调用"),

    // ===================访问权限类错误======================
    /** api权限错误 */
    apiNoAuthorityError("OP00000013", "您暂无权限访问api[{0}]!"),
    /** 产品权限错误 */
    prdNoAuthorityError("OP00000014", "您暂无权限访问服务[{0}]!"),
    /** 产品状态错误 */
    prdSateError("OP00000015", "服务已下架或已删除[{0}]!"),

    apiSateError("OP00000016", "api[%s]已下架或已删除!"),
    /** 服务发布失败 */
    deployApiError("OP00000017", "api发布失败!"),
    /** 协议适配失败 */
    protocolDispatchError("OP00000018", "暂不支持协议类型[{0}]!"),
    /** 未配置协议 */
    noProtocolError("OP00000019", "修改api[{0}]未配置内部转换协议!"),
    /** api维度并发访问控制错误 */
    apiCurrentCotrolError("OP00000020", "该api当前请求过多,请稍后再试!"),

    // ===================安全类错误（加解密、签名验签）======================
    /** 秘钥错误 */
    appSecretKeyError("OP00000022", "应用秘钥已失效,请重新申请!"),
    /** 解密失败 */
    decryptError("OP00000023", "解密失败,请检查加密数据!"),
    /** 签名失败 */
    signError("OP00000021", "签名失败,请联系客服人员"),
    /** 验签失败 */
    verifyError("OP00000024", "验签失败,请检查签名数据!"),
    /** 签名数据为空 */
    decodeBase64Error("OP00000025", "base64解码失败!"),
    /** 系统维度并发访问控制错误 */
    sysCurrentCotrolError("OP00000026", "系统当前请求过多,请稍后再试!"),
    /** 系统维度流量访问控制错误 */
    sysBandwidthCotrolError("OP00000027", "系统当前请求流量过大,请稍后再试!"),
    /** 重复提交（重放、技术幂等）访问控制错误 */
    accessRepeatCotrolError("OP00000028", "请勿重复提交,requestId[{0}]!"),
    /** 当前请求接口错误率过高，已经强制熔断，请稍后再试 */
    hystrixFallBackError("OP00000029", "当前服务已限制访问，请稍后重试。"),
    /** 加密失败 */
    encryptError("OP00000030", "加密失败"),
    /** 报文格式异常 */
    bodyFormatError("OP00000031", "报文格式不符合规范"),

    verificateAccessToken("OP00000032", "accessToken已经失效"),

    commError("OP00000033", "该通信服务不存在"), apiServiceError("OP00000034", "%s该通信服务不存在"),
    connectError("OP00000035", "连接出错"), getIPError("OP00000036", "获取服务器IP失败"),
    /*==============黑名单=================*/
    accessIPError("OP00000037", "您的IP被禁止请求该平台所有请求,请联系平台管理员"), accessRouteBlackError("OP00000038", "您的请求路由被禁止,请联系平台管理员"),
    accessMacBlackError("OP00000039", "您请求的Mac值被禁止,请联系平台管理员"),
    accessMobileBlackError("OP00000040", "您请求的手机号被禁止,请联系平台管理员"),
    accessEmailBlackError("OP00000041", "您请求的电子邮箱被禁止,请联系平台管理员"),
    accessUserIdBlackError("OP00000042", "您请求的用户ID被禁止,请联系平台管理员"),
    accessThirdPartyIdBlackError("OP00000043", "您请求的第三方ID被禁止,请联系平台管理员"),
    accessAppIdBlackError("OP00000044", "您请求的应用ID被禁止,请联系平台管理员"), decodeError("OP00000045", "%s解密失败"),
    encodeError("OP00000046", "%s加密失败"), isNotString("OP00000047", "%s要解密但却不是字符串"),
    notHaveSession("OP00000048", "请先登录!"), notHaveTemplate("OP00000049", "%s报文头模板不存在"),
    accessIpInBlackListError("OP00000101", "您的%sIP地址已限制访问，请稍后重试。"),
    /*==============白名单=================*/
    accessIpNotInWhiteListError("OP00000100", "%sIP尚未加入网关访问白名单，请加入后重试。"),
    /*==============其它=================*/
    accessChannelNotAuthorizedError("OP00000102", "您无权限调用本接口，请申请开通。"),
    accessChannelAuthorizedNoDataError("OP00000103", "请联系管理员维护接口可访问渠道权限！"),
    /** 接口统一识别码编码 TODO */
    interfaceCodeError("OP00000050", "接口码异常"), paramValueError("OP00000051", "参数值%s异常"),
    paramError("OP00000052", "参数%s异常"), requestIdParamLegalityError("OP00000053", "参数requestId不合法"),
    versionLegalityError("OP00000054", "参数version不合法"), getMerchantInfoError("OP00000055", "获取商户信息失败"),
    merchantError("OP00000056", "商户不可用"), interfaceError("OP00000057", "接口不可用"),
    channelCodeOrTransCodeIsNullError("OP00000058", "channelCode或者transCode不能为空"),
    apiChannelError("OP00000059", "请求方式异常!"),

    /** 成功 */
    success("0000000000", "请求成功!"),
    /** 未知状态：如接口正常返回但网关签名加密失败 */
    notFound("OP00009997", "404"),
    /** 未知状态：如接口正常返回但网关签名加密失败 */
    unknow("OP00009998", "未知错误,该笔交易最终状态未知请回查核对!"),
    /** 失败 */
    error("OP00009999", "非常抱歉,系统错误!"),

    // OAuth授权认证相关
    /** 用户Id为空 */
    oauthNotFoundReqUserIdError("OP00000060", "用户Id为空"),
    /** 未配置H5应用初始参数:登录URL */
    oauthNotFoundInitLoginUrlError("OP00000061", "未配置H5应用初始参数:登录URL"),
    /** 未配置H5应用初始参数：授权URL */
    oauthNotFoundInitAuthUrlError("OP00000062", "未配置H5应用初始参数：授权URL"),
    /** 未授权登录 */
    oauthNotFoundReqTokenError("OP00000063", "未授权登录"),
    /** token已失效 */
    oauthNotFoundTokenError("OP00000064", "token已失效"),
    /** 未授权服务 */
    oauthNoAuthServiceError("OP00000065", "未授权服务"),
    /** 校验token失败 */
    oauthCheckTokenError("OP00000066", "校验token失败"),
    /** 数据异常：服务没有对应的有效期 */
    oauthServiceValidTimeError("OP00000067", "服务未授权"),
    /** 授期服务过期 */
    oauthAuthServiceTimeoutError("OP00000068", "授期服务过期"),
    /** 未配置H5应用初始参数：授权URL */
    oauthNotFoundInitAuthAppidError("OP00000069", "未配置H5应用Id"),

    oauthAppIdOrSecretIsNullError("OP00000074", "appId或者appSecret或者channel为空!"),
    oauthAppIdAndSecretNoRelationError("OP00000075", "您的API 账号与当前渠道尚未建立绑定关系，请绑定后重试!"),
    oauthLoseEfficacyError("OP00000076", "Token 已失效，请重新获取!"),
    oauthWrongTokenError("OP00000077", "您的Token或API账号有误，请检查!"),

    requestIdRepeadError("OP00000078", "requestId重复!"),
    oauthVersionIsNullError("OP00000079", "version为空!"),
    oauthAccessTokenIsNullError("OP00000080", "accessToken为空!"),
    oauthUserIdIsNullError("OP00000081", "userId为空!"),
    oauthRequestIdIsNullError("OP00000082", "requestId为空!"),


    /** SDK版本号过低，请及时更新SDK版本(未上送SDK版本号) */
    checkSdkNotSendVersionError("OP00000070", "SDK版本号过低，请及时更新SDK版本"),
    /** SDK版本不一致 */
    checkSdkVersionError("OP00000071", "SDK版本号过低，请及时更新SDK版本"),

    /** 秘钥错误 */
    appSecretNotFoundError("OP00000072", "密钥不存在,请配置密钥!"),
    /** app信息不存在 */
    appInfoNotFoundError("OP00000073", "app信息不存在"),

    hystrixCircuitError("OP00000074", "系统正在开小差,请稍后再试!"),
    currentLimitingError("OP00000075", "%s接口在规定时间段内触发限流规则，接口繁忙，请稍后再试。"),;

    private final Map<String, String> errorMap = new HashMap<String, String>();

    ErrorEnum(String code, String msg) {
        this.errorMap.put(Constants.ERROR_CODE, code);
        this.errorMap.put(Constants.ERROR_MSG, msg);
    }

    public String code() {
        return this.errorMap.get(Constants.ERROR_CODE);
    }

    public String msg() {
        return this.errorMap.get(Constants.ERROR_MSG);
    }

    public static ErrorEnum geterrorEnum(String code) {
        for (ErrorEnum errorEnum : ErrorEnum.values()) {
            if (code.equals(errorEnum.code())) {
                return errorEnum;
            }
        }
        return null;
    }
}
